package la.iok.hzsvn.lewin.movie.shopmovie.service;

import la.iok.hzsvn.lewin.movie.shopmovie.entity.Carpool;
import la.iok.hzsvn.lewin.movie.shopmovie.entity.Player;
import la.iok.hzsvn.lewin.movie.shopmovie.entity.PlayerFee;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.Nullable;

public interface PlayerFeeService extends BaseService<PlayerFee, Long> {
    /**
     * 保存剧本费
     * @param player 玩家
     * @param amount 剧本费用金额
     * @return 新增记录id或者已经存在记录的id
     */
    Long saveMovieFee(@NotNull Player player, @Nullable Integer amount);

    /**
     * 查询玩家剧本费
     * @param playerId 玩家id
     * @return 剧本费
     */
    @Nullable
    PlayerFee movieFee(@Nullable Long playerId);

    /**
     * 保存附加费
     * @param player 玩家
     * @param name 费用名称
     * @param amount 费用金额
     * @return 新增记录id或者已经存在记录的id
     */
    Long saveAdditionalFee(@NotNull Player player, @Nullable String name, @Nullable Integer amount);

    /**
     * 更新拼车中玩家的剧本费。如果拼车有选择剧本且有玩家还没有添加剧本费,则添加玩家的剧本费。对于已经添加了剧本费的玩家，则无操作
     * @param carpool 拼车对象,需要是数据库对象,需要有id字段
     */
    void updateMovieFee(@NotNull Carpool carpool);

    /**
     * 确认收费。记录支付方式、确认人、确认时间
     * @param playerFee 收费项，保存计算的数据
     * @return 修改的记录数,应该是1
     */
    int confirmPaid(@NotNull PlayerFee playerFee);

    /**
     * 取消支付。将状态设置为未支付，同时支付确认人、支付时间、支付方式都设置为0（默认值）
     * @param playerFee 收费项，id和版本需要有值
     * @return 修改的记录数,应该是1
     */
    int cancelPayment(@NotNull PlayerFee playerFee);

    /**
     * 增加优惠券抵扣金额。此方法在现有抵扣的金额上增加amount值。目前增加之前有判断费用项抵扣的金额必须为0，这样避免重复多次使用优惠券抵扣
     * @param id 玩家费用项id
     * @param version 玩家费用项当前数据版本
     * @param amount 增加的抵扣金额，单位分
     * @return 修改的记录数,应该是1
     */
    int addCouponDeductionAmount(@NotNull Long id, @NotNull Long version, int amount);

    int setCouponDeductionAmount(@NotNull Long id, @NotNull Long version, int amount);
}
